package fr.bugtracker.service.administration.utilisateur;

import java.util.Calendar;
import java.util.List;

import javax.ejb.EJB;
import javax.ejb.LocalBean;
import javax.ejb.Stateless;

import fr.bugtracker.commun.dto.DtoRetourPagination;
import fr.bugtracker.commun.enumeration.EnumLoggerLevel;
import fr.bugtracker.commun.exception.ExceptionFonctionnelle;
import fr.bugtracker.commun.outils.UtilsHibernate;
import fr.bugtracker.commun.outils.UtilsLogger;
import fr.bugtracker.dao.technique.DaoProfil;
import fr.bugtracker.dao.technique.DaoUtilisateur;
import fr.bugtracker.entity.technique.Profil;
import fr.bugtracker.entity.technique.Utilisateur;
import fr.bugtracker.service.AbstractService;

/**
 * Session Bean implementation class SrvGererUtilisateur
 */
@Stateless
@LocalBean
public class SrvGererUtilisateur extends AbstractService {

	/**
	 * fr.bugtracker.dao des utilisateurs
	 */
	@EJB
	private DaoUtilisateur daoUtilisateur;
	/**
	 * fr.bugtracker.dao des roles
	 */
	@EJB
	private DaoProfil daoProfil;

	/**
	 * Default constructor.
	 */
	public SrvGererUtilisateur() {
	}

	/**
	 * Retourne l'utilisateur par rapport a son id
	 * @param id {@link Integer}
	 * @return {@link Utilisateur}
	 */
	public Utilisateur getUtilisateurById(Integer id) {
		return daoUtilisateur.find(id);
	}

	/**
	 * Retourne les utilisateurs par rapport a la pagination jpa
	 * @param first int
	 * @param pageSize int
	 * @param sortField {@link String}
	 * @param sortOrder {@link String}
	 * @param typeRecherche {@link Boolean}
	 * @return {@link DtoRetourPagination}
	 */
	public DtoRetourPagination getUtilisateurLazy(int first, int pageSize, String sortField, String sortOrder, boolean typeRecherche) {
		return daoUtilisateur.rechercherUtilisateur(first, pageSize, sortField, sortOrder, typeRecherche);
	}

	/**
	 * Retourne la liste de tous les profil
	 * @return {@link List}< {@link Profil} >
	 */
	public List<Profil> getAllProfil() {
		return daoProfil.findAll();
	}

	/**
	 * Permet de modifier l'utilisateur
	 * @param utilisateur {@link Utilisateur} l'utilisateur à modifier
	 * @throws ExceptionFonctionnelle -
	 */
	public void modifierUtilisateur(Utilisateur utilisateur) throws ExceptionFonctionnelle {
		if (utilisateur.getProfil() == null) {
			throw new ExceptionFonctionnelle("fonctionnel.utilisateur.erreur.role_vide");
		}
		daoUtilisateur.edit(utilisateur);
	}

	/**
	 * Supprime l'utilisateur en parametre
	 * @param utilisateur {@link Utilisateur}
	 */
	public void supprimerUtilisateur(Utilisateur utilisateur) {
		utilisateur = daoUtilisateur.find(utilisateur.getId());
		utilisateur.setDateSuppression(Calendar.getInstance().getTime());
		UtilsLogger.logFonctionnel(EnumLoggerLevel.info, false, "fonctionnel.utilisateur.info.suppression", utilisateur.getUsername());
		UtilsHibernate.getSession().flush();
	}

	/**
	 * Réactive le compte de l'utilisateur en parametre
	 * @param utilisateur {@link Utilisateur}
	 */
	public void ractiverCompte(Utilisateur utilisateur) {
		utilisateur = daoUtilisateur.find(utilisateur.getId());
		utilisateur.setDateSuppression(null);
		UtilsLogger.logFonctionnel(EnumLoggerLevel.info, false, "fonctionnel.utilisateur.info.reactivation", utilisateur.getUsername());
		UtilsHibernate.getSession().flush();
	}

}
